package org.vpac.grisu.frontend.control;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.HashSet;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.xml.namespace.QName;
import org.apache.commons.io.IOUtils;
import org.apache.cxf.aegis.AegisContext;
import org.apache.cxf.aegis.databinding.AegisDatabinding;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.vpac.grisu.control.CXFServiceInterface;
import org.vpac.grisu.control.ServiceInterface;
import org.vpac.grisu.control.ServiceInterfaceCreator;
import org.vpac.grisu.control.exceptions.ServiceInterfaceException;
import org.vpac.grisu.frontend.control.cxf.ClientAuthInterceptor;
import org.vpac.grisu.settings.Environment;
import com.sun.org.apache.xerces.internal.dom.DocumentImpl;
public class CXFServiceInterfaceCreator implements ServiceInterfaceCreator {
public static String TRUST_FILE_NAME = Environment
.getGrisuClientDirectory().getPath()
+ File.separator
+ "truststore.jks";
/**
* configures secure connection parameters.
**/
public CXFServiceInterfaceCreator() throws ServiceInterfaceException {
try {
if (!(new File(Environment.getGrisuClientDirectory(),
"truststore.jks").exists())) {
final InputStream ts = CXFServiceInterfaceCreator.class
.getResourceAsStream("/truststore.jks");
IOUtils.copy(ts, new FileOutputStream(TRUST_FILE_NAME));
}
} catch (final IOException ex) {
throw new ServiceInterfaceException(
"cannot copy SSL certificate store into grisu home directory. Does "
+ Environment.getGrisuClientDirectory().getPath()
+ " exist?", ex);
}
System.setProperty("javax.net.ssl.trustStore", TRUST_FILE_NAME);
}
public boolean canHandleUrl(String url) {
if (url != null) {
return url.startsWith("http");
} else {
return false;
}
}
public ServiceInterface create(String interfaceUrl, String username,
char[] password, String myProxyServer, String myProxyPort,
Object[] otherOptions) throws ServiceInterfaceException {
return create(interfaceUrl, username, new String(password),
myProxyServer, Integer.parseInt(myProxyPort));
}
public ServiceInterface create(String serviceInterfaceUrl, String username,
String password, String myproxyServer, int myproxyPort) {
final JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
final AegisDatabinding aDB = new AegisDatabinding();
final AegisContext acontext = new AegisContext();
final HashSet<java.lang.Class<?>> classes = new HashSet<java.lang.Class<?>>();
classes.add(DocumentImpl.class);
acontext.setRootClasses(classes);
final HashMap<Class<?>, String> classMap = new HashMap<Class<?>, String>();
classMap.put(DocumentImpl.class, "org.w3c.dom.Document");
/*
* acontext.setBeanImplementationMap(classMap);
* acontext.setReadXsiTypes(true); acontext.setWriteXsiTypes(true);
*/
acontext.setMtomEnabled(true);
/**
* System.out.println(acontext.getTypeMapping().getType(FileDataSource.
* class)); acontext.getTypeMapping().register(FileDataSource.class,
* XMLSchemaQNames.XSD_BASE64, new DataSourceType(false, null));
**/
aDB.setAegisContext(acontext);
factory.setServiceClass(CXFServiceInterface.class);
factory.setAddress(serviceInterfaceUrl);
factory.getServiceFactory().setDataBinding(aDB);
factory.setServiceName(new QName(
"http://serviceInterfaces.control.grisu.vpac.org/", "grisu"));
/* factory.setWsdlLocation(serviceInterfaceUrl +"?wsdl"); */
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
factory.getOutInterceptors().add(
new ClientAuthInterceptor(username, password, myproxyServer,
myproxyPort));
final ServiceInterface service = (ServiceInterface) factory.create();
final Client client = ClientProxy.getClient(service);
client.getEndpoint().put("mtom-enabled", "true");
/**
* org.apache.cxf.aegis.type.basic.BeanType:
* [class=javax.activation.FileDataSource,
* QName={http://activation.javax}FileDataSource,
* info=org.apache.cxf.aegis.type.java5.AnnotatedTypeInfo@171b4ca]
* org.apache.cxf.aegis.type.mtom.DataSourceType[class=javax.activation.
* DataSource, QName={http://www.w3.org/2001/XMLSchema}base64Binary]
* org.
* apache.cxf.aegis.type.mtom.DataHandlerType[class=javax.activation.
* DataHandler, QName={http://www.w3.org/2001/XMLSchema}base64Binary]
**/
System.out.println(acontext.getTypeMapping().getType(
FileDataSource.class));
System.out.println(acontext.getTypeMapping().getTypeCreator()
.createType(DataSource.class));
System.out.println(acontext.getTypeMapping().getTypeCreator()
.createType(DataHandler.class));
/*
* Service s = aDB.getService();
*
* s.put("org.w3c.dom.Document.implementation",
* "org.apache.xerces.dom.DocumentImpl");
*/
return service;
}
/*
* public static void main(String[] args) throws Exception{ ServiceInterface
* service =
* create("http://globus.ceres.auckland.ac.nz/grisu-cxf-1.0.0/services/grisu"
* , "yhal003","secret","myproxy.arcs.org.au",443);
*
* String[] sls = service.getAllSubmissionLocations();
* System.out.println(service.calculateRelativeJobDirectory("freak1")); for
* (String sl:sls){ System.out.println(sl); }System.out.println(service.ls(
* "gsiftp://ng2.auckland.ac.nz/home/grid-bestgrid/C_NZ_O_BeSTGRID_OU_The_University_of_Auckland_CN_Yuriy_Halytskyy"
* ,1,true)); service.login("yhal003","".toCharArray());
*
* }
*/
}